LeetCode-8-字符串转整数 (atoi)

Posted by 刘知安 on 2018-11-15
文章目录
  1. 题目内容
    1. 描述
    2. 说明
    3. 示例:
  • 解法
    1. 要注意的地方
  • 题目内容

    描述

    实现 atoi,将字符串转为整数。

    在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

    字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

    当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

    若函数不能执行有效的转换,返回 0。

    说明

    假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (2^31 − 1)INT_MIN (−2^31)

    示例:

    • 示例1
    1
    2
    3
    4
    5
    输入: "   -42"
    输出: -42

    解释: 第一个非空白字符为 '-', 它是一个负号。
    我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
    • 示例2
    1
    2
    3
    4
    5
    输入: "   -42"
    输出: -42

    解释: 第一个非空白字符为 '-', 它是一个负号。
    我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
    • 示例3
    1
    2
    3
    输入: "4193 with words"
    输出: 4193
    解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
    • 示例4
    1
    2
    3
    4
    输入: "words and 987"
    输出: 0
    解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
    因此无法执行有效的转换。
    • 示例5
    1
    2
    3
    4
    输入: "-91283472332"
    输出: -2147483648
    解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
    因此返回 INT_MIN (−231) 。

    解法

    首先,肯定是将字符串的头尾空格去掉。strip()函数真好用。

    然后,我的第一反应是排除非法情况,后来在布尔条件配合and和or判断时有点混乱了 。。。这时不妨换个思路,把一些合法的情况找出来就OK,无非就三种

    • 正号开头
    • 负号开头
    • 数字开头

    最后,就是比较常规的“乘10加当前数值”操作,别忘了最后有个确定符号的操作和溢出的判断。

    总体还是easy,不过有一些细节值得记录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    class Solution:
    def myAtoi(self, str):
    """
    :type str: str
    :rtype: int
    """
    # 去除首尾空格
    str = str.strip()
    if str == "":
    return 0
    # 判断输入字符串是否合法(即是否需要转换 )
    legal = (ord(str[0]) >= 48 and ord(str[0]) <= 57) or str[0] == '-' or str[0] == '+'
    if not legal:
    return 0
    # 没有符号,默认为正数
    sign = 1
    if str[0] == '-':
    sign = -1
    str = str[1:]
    elif str[0] == '+':
    str = str[1:]

    # 不断除以10
    result = 0
    for i in range(len(str)):
    if ord(str[i]) >= 48 and ord(str[i]) <= 57:
    result = 10 * result + (ord(str[i]) - 48)
    continue
    break
    # 溢出判断
    if result * sign <= -2 ** 31:
    return -2 ** 31
    elif result * sign >= 2 ** 31 - 1:
    return 2 ** 31 - 1
    else:
    return result * sign


    s = Solution()
    print(s.myAtoi(""))

    要注意的地方

    • 去除首尾空格(也可以去除别的字符,给定参数即可)——strip()函数

    • python中布尔型变量取反,用not关键字。(在别的语言里面我们会用 !Flag这样的操作)

    • python中没有字符相加减,但可以用ord(ch)函数获取字符chASCII码